package com.xiangxg.jvm.classloader;

/**

 * 常量在编译阶段会存入到调用这个常量的方法所在的类的常量池中，
 * 本质上，调用类并没有直接引用到定义常量的类，因此并不会触发定义常量的类的初始化
 * 注意：这里指的是将常量存放到了MyTest2的常量池中，之后MyTest2与MyParent2就没有任何关系了
 * 甚至，我们可以将MyParent2的class文件删除
助记符：
 javap -c com.xiangxg.jvm.classloader.MyTest2 反编译
 javap -verbose com.xiangxg.jvm.classloader.MyTest2

 ldc表示将int,float或者是String类型的常量值从常量 池中推送至栈顶
 bipush表示将单字节（-128 ~ 127）的常量池推送栈顶
 sipush表将一个短整形常量池（-32768 ~ 32767）推送至栈顶
 iconst_1表示将int类型1推送至栈顶（iconst_1 ~ iconst_5）
 */
public class MyTest2 {
    public static void main(String[] args) {
        System.out.println(MyParent2.str);
    }
}
class MyParent2{
    //场景1
    //public static String str = "hello world";
    //场景2
    public static final String str = "hello world";
    //场景3 测试反编译助记符 javap -c com.xiangxg.jvm.MyTest2
    //bipush
    public static final short s = 7;
    //sipush
    public static final short i = 128;
    //iconst_1
    public static final short m = 5;
    static {
        System.out.println("MyParent2 static block");
    }
}
